#ifndef inst_guard
#define inst_guard

#include <stdlib.h>
#include <stdint.h>



#define NUM_INSTRTYPE 30  //操作数对应的数组大小

//============================内存====================================

// //内存初始化
// #define MM_LEN 1000     //1000个Byte

// uint8_t mm[MM_LEN];     //每8个Byte放一个内存

// operation的枚举，操作的枚举
typedef enum OP
{
    mov_reg_reg,        // 0 
    mov_reg_mem,        // 1
    mov_mem_reg,        // 2
    push_reg,           // 3
    pop_reg,            // 4
    call,               // 5
    ret,                // 6
    add_reg_reg,        // 7
} op_t;

//操作的种类，对应着一堆的if和else
typedef enum OD_TYPE
{
    EMPTY,                                        //0
    IMM,REG,                                      //1、2
    MM_IMM,MM_REG,MM_IMM_REG,MM_REG1_REG2,        //3、4、5、6
    MM_IMM_REG1_REG2,MM_REG2_S,MM_IMM_REG2_S,     //7、8、9
    MM_REG1_REG2_S,MM_IMM_REG1_REG2_S             //10、11
} od_type_t;

//地址的结构体
typedef struct OD
{
    od_type_t type;

    int64_t imm;   //immediate number    一定是有符号数
    int64_t scal;  //scale
    uint64_t *reg1;  //register1
    uint64_t *reg2;  //register2

} od_t;

//指令
typedef struct INSTRUCT_STRUCT{
    op_t op;    //   move,push
    od_t src;   //   源地地址
    od_t dst;   //   目标地址
    char code[100];  //命令代码本身
} inst_t;

//指令周期，循环
void instruction_cycle();


// pointer pointing to the function
// 函数指针
// handler首先是一个指针
// 类似定义了一个返回值是void类型的函数，参数是两个int64
typedef void (*handler_t)(uint64_t, uint64_t);

//函数指针数组
static handler_t handler_table[NUM_INSTRTYPE];

//初始化handler数组
void init_handler_table();

//指令周期函数
void instruction_cycle();


//函数指针对应的实现函数们
void mov_reg_reg_handler(uint64_t src, uint64_t dst);

void call_handler(uint64_t src, uint64_t dst);

void add_reg_reg_handler(uint64_t src, uint64_t dst);

void push_reg_handler(uint64_t src, uint64_t dst);

void pop_reg_handler(uint64_t src, uint64_t dst);

void mov_reg_mem_handler(uint64_t src, uint64_t dst);

void mov_mem_reg_handler(uint64_t src, uint64_t dst);

void ret_handler(uint64_t src, uint64_t dst);

#endif